草庐IT

MySQL InnoDB 锁的二三事

全部标签

详解 Redis 分布式锁的五种方案

本地加锁​的方式在分布式的场景下不适用,所以本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。本篇主要内容如下:一、本地锁的问题首先我们来回顾下本地锁的问题:目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied​ 或 lock​)来锁住自己的线程资源,从而防止缓存击穿。这是一种本地加锁​的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不

详解 Redis 分布式锁的五种方案

本地加锁​的方式在分布式的场景下不适用,所以本文我们来探讨下如何引入分布式锁解决本地锁的问题。本篇所有代码和业务基于我的开源项目PassJava。本篇主要内容如下:一、本地锁的问题首先我们来回顾下本地锁的问题:目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了10W个请求,每个微服务接收2.5W个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁(synchronzied​ 或 lock​)来锁住自己的线程资源,从而防止缓存击穿。这是一种本地加锁​的方式,在分布式情况下会带来数据不一致的问题:比如服务A获取数据后,更新缓存key=100,服务B不

我,管理100多人技术团队的二三事

我负责的技术团队,现在有100人出头。团队里包括了:前端、后端、测试、运维&DBA、还有几个客户端和AI工程师。我下面分了7个组,每个组都有一名组长,组长们汇报给我。100多人的技术团队,我是怎么带的呢?我带团队是从3、5个人、十几个人、几十个人团队一点点锻炼出来的。自我评价,我觉得我管理的团队说不上有多好,但是感觉不错。团队气氛挺融洽,大家也比较稳定,尤其是核心同事离职率很低。用他们的话来说:"跟着我干,钱虽然一般,但干得比较爽。”这是实话,我们公司的工资和大厂比不了,同事里有些人技术很强,以他们的能力去大厂没问题。我管理团队的方式,主要自己一点点总结出来的,可以说是野路子吧。虽然以前看过书

我,管理100多人技术团队的二三事

我负责的技术团队,现在有100人出头。团队里包括了:前端、后端、测试、运维&DBA、还有几个客户端和AI工程师。我下面分了7个组,每个组都有一名组长,组长们汇报给我。100多人的技术团队,我是怎么带的呢?我带团队是从3、5个人、十几个人、几十个人团队一点点锻炼出来的。自我评价,我觉得我管理的团队说不上有多好,但是感觉不错。团队气氛挺融洽,大家也比较稳定,尤其是核心同事离职率很低。用他们的话来说:"跟着我干,钱虽然一般,但干得比较爽。”这是实话,我们公司的工资和大厂比不了,同事里有些人技术很强,以他们的能力去大厂没问题。我管理团队的方式,主要自己一点点总结出来的,可以说是野路子吧。虽然以前看过书

利用MySQL实现分布式锁,涉及到乐观锁和悲观锁的思想

目录背景一些基础实现类不加锁乐观锁悲观锁总结背景对于一些并发量不是很高的场景,使用MySQL来实现分布式锁会比较精简且巧妙。下面就一个小例子,针对不加锁、乐观锁以及悲观锁这三种方式来实现。主要是一个用户表,它有一个年龄的字段,然后并发地对其加一,看看结果是否正确。一些基础实现类@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateIntegerage;privateStringname;privateLongid;privateLongversion;}publicinterfaceUserMapper

利用MySQL实现分布式锁,涉及到乐观锁和悲观锁的思想

目录背景一些基础实现类不加锁乐观锁悲观锁总结背景对于一些并发量不是很高的场景,使用MySQL来实现分布式锁会比较精简且巧妙。下面就一个小例子,针对不加锁、乐观锁以及悲观锁这三种方式来实现。主要是一个用户表,它有一个年龄的字段,然后并发地对其加一,看看结果是否正确。一些基础实现类@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateIntegerage;privateStringname;privateLongid;privateLongversion;}publicinterfaceUserMapper

MySQL InnoDB 锁的二三事

近日, 在一个小型项目中, 遇到了一个触及我知识盲区的bug. 项目用的是MySQL5.7.25, 其中有一张表 config_data,包含四个字段,id,name,value,expireAt.其中id为主键,name建有唯一索引,表的用途大概就是存放一些有时效性的配置.以上就是这次故事的背景.(不要问我为什么要用这么奇怪的方式处理需要过时的配置,项目太简陋以至只有一台虚拟主机和一个数据库,别的什么都没了,包括Redis) 这张表的使用场景大致为,假设需要使用某配置a,先尝试从表中查找a,若找到,判断是否过期,过期或者值不存在则从外部获取配置的值并存入表中,以便下次使用. 伪代码流程如下:

MySQL InnoDB 锁的二三事

近日, 在一个小型项目中, 遇到了一个触及我知识盲区的bug. 项目用的是MySQL5.7.25, 其中有一张表 config_data,包含四个字段,id,name,value,expireAt.其中id为主键,name建有唯一索引,表的用途大概就是存放一些有时效性的配置.以上就是这次故事的背景.(不要问我为什么要用这么奇怪的方式处理需要过时的配置,项目太简陋以至只有一台虚拟主机和一个数据库,别的什么都没了,包括Redis) 这张表的使用场景大致为,假设需要使用某配置a,先尝试从表中查找a,若找到,判断是否过期,过期或者值不存在则从外部获取配置的值并存入表中,以便下次使用. 伪代码流程如下:

redis分布式锁的实现

一.正常加锁当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。具体步骤:获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据库,释放锁资源。 二.线程出现阻塞当A线程加锁后出现阻塞时,导致数据还没有存到数据库,锁的时间便会失效。B线程便会执行,对数据进行加锁,成功后保存到数据库,而这时A线程启动,将数据保存到数据库,这时的数据便又会重复。解决方法:对锁进行延期,加锁成功后新建一个守护线程,监控锁的过期时间,如果这个时间小于设置的时间,则会自动延期问题:1.为何使用守护线程不一定要用守护线程,只要能保证对锁进行延期即可2.为何要设置过期时间为了避免出现

redis分布式锁的实现

一.正常加锁当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。具体步骤:获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据库,释放锁资源。 二.线程出现阻塞当A线程加锁后出现阻塞时,导致数据还没有存到数据库,锁的时间便会失效。B线程便会执行,对数据进行加锁,成功后保存到数据库,而这时A线程启动,将数据保存到数据库,这时的数据便又会重复。解决方法:对锁进行延期,加锁成功后新建一个守护线程,监控锁的过期时间,如果这个时间小于设置的时间,则会自动延期问题:1.为何使用守护线程不一定要用守护线程,只要能保证对锁进行延期即可2.为何要设置过期时间为了避免出现